false == []
![]  == '' 
![] == []
!{} == {}

// 下面的代码输出什么（新东方）？
var obj1 = {
  a: 1,
  b: 2,
  valueOf: function () {
    return this.a + this.b;
  },
  toString: function () {
    return 1;
  },
};

var obj2 = {
  toString: function () {
    return 0;
  },
};

console.log(obj1 + !!obj2);

/**
 * 
 == 的隐式类型转换
 1. 两边如果存在null或者undefined，他们只和对方以及自身相等，和其他的都不等
 2. 如果等式两边有布尔类型，要将布尔类型转化成数字
 3. 如果等式两边有数字，就要将不是数字的那边转化成数字
 4. 如果等式两边有对象存在，就要调用对象的ToPrimitive方法，转换为原始类型，
 原理是先调用valueof转换为原始类型，但是如果不是原始类型，就调用toString方法


  
 转数字   null  ==>  0  , undefined==>  NaN ,  true ==>  1 ,  false==>  0,    '' ==> 0 ,   "        " ==>  0
 
 加法运算操作符  
  1如果有一侧为String类型，则将另一侧转换为字符串，最后连接起来
  2如果有一侧是Number类型,另一侧是原始类型,则将元素类型转换成Number类型
  3如果有一侧是Number类型,另一侧为引用类型，将引用类型和Number类型转换成字符串后拼接
  4如果两边不是string跟Number那么 直接转 数字 运算  
  
  
  [].valueOf() ==> []
  [].toString() ==>  ""
 */